package ${d.pkg};

<#list d.imports as imps>
import ${imps};
</#list>
import org.apache.ibatis.annotations.Param;

/**
 *	Dao (${d.e.tableName})
 *  ${d.e.tableDesc!""}
 *
 *	@author ${d.e.author!""} (${d.e.authorEnglish!""})
 *	@date ${d.e.createTime}
 */
@${d.annotationName}
public interface ${d.className} {

    /**
     *  查询全部数据（慎用！！！）
     */
    List<${d.e.className}> findAll(@Param("fields") ${d.fe.className} fields);

    /**
     *  条件查询
     *  <p> 多个query之间是or的关系
     */
    List<${d.e.className}> findByQuery(@Param("fields") ${d.fe.className} fields, @Param("query") ${d.q.className} query);
    /**
     *  条件查询
     *  <p> 多个query之间是or的关系
     */
    List<${d.e.className}> findByQueryWithOrderBy(
                @Param("fields") ${d.fe.className} fields,
                @Param("orderBy") ${d.ob.className} orderBy,
                @Param("query") ${d.q.className} query);

    /**
     *  查询总数（慎用！！！）
     */
    int count();
    /**
     *  条件查询数量
     *  <p> 多个query之间是or的关系
     */
    int countByQuery(@Param("query") ${d.q.className} query);
    /**
     *  分页查询
     *  <p> 多个query之间是or的关系
     */
    @Pagement(count="countByQuery")
    Pager<${d.e.className}> findByPage(
                @Param("fields") ${d.fe.className} fields,
                @Param("page") Pager<${d.e.className}> pager,
                @Param("query") ${d.q.className} query);
    /**
     *  分页查询
     *  <p> 多个query之间是or的关系
     */
    @Pagement(count="countByQuery")
    Pager<${d.e.className}> findByPageWithOrderBy(
                @Param("fields") ${d.fe.className} fields,
                @Param("page") Pager<${d.e.className}> pager,
                @Param("orderBy") ${d.ob.className} orderBy,
                @Param("query") ${d.q.className} query);


    /**
     *  插入
     *  <p> 如果存在唯一自增主键字段，则insert完成后该字段保存该条记录自增的值
     */
    void insert(@Param("entity") ${d.e.className} entity);
    /**
     *  批量插入
     *  <p> 如果存在唯一自增主键字段，则insert完成后该字段保存该条记录自增的值
     */
    void multipleInsert(@Param("entities") List<${d.e.className}> entities);


    /**
     *  修改
     *  <p> 多个query之间是or的关系
     */
    int update(@Param("entity") ${d.e.className} entity, @Param("query") ${d.q.className} query);
    /**
     *  批量修改
     *  <p> 每个MultipleUpdate对应一个update语句
     */
    int multipleUpdate(@Param("updates") List<MultipleUpdate> multipleUpdates);


    /**
     *  删除
     */
    int delete(@Param("query") ${d.q.className} query);


    /**
     *  批量修改参数
     */
    public static class MultipleUpdate extends ${d.mutileUpdateName}<${d.e.className}, ${d.q.className}> {
        public MultipleUpdate(${d.e.className} entity, ${d.q.className} query) {
            super(entity, query);
        }
        public static MultipleUpdate build(${d.e.className} entity, ${d.q.className} query) {
            return new MultipleUpdate(entity, query);
        }
        /**
         *  copy（注：这是浅拷贝）
         */
        public MultipleUpdate copy() {
            return new MultipleUpdate(entity.copy(), query.copy());
        }
    }
}